﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;

namespace MortEdit
{
    // klasa odpowiedzialna za obsługę pojedynczego pliku
    // (otwieranie, zapisywanie, tworzenie nowego pliku i inne operacje)
    public class File
    {
        public string actualFileName = "";  // Nazwa aktualnie otwartego pliku  
        public bool isModified = false;    // "Czy plik został zmodyfikowany?"
        public bool isSaved = false;     // czy plik został zapisany
        public int fileCounter = 0;     // Licznik otwartych już plików

        private StreamWriter sWriter;
        private StreamReader sReader;
        private DialogResult dlgResult = new DialogResult();
        private SaveFileDialog sfDialog = new SaveFileDialog();
        private OpenFileDialog ofDialog = new OpenFileDialog();

        public Form1 form1;

        // Tworzy nowy plik i czyści richTextBoxa
        public void New(object sender, EventArgs e)
        {
            form1.CheckModified(sender, e);

            this.actualFileName = "";

            // Czyszczenie pola tekstowego
            form1.richTextBox.Clear();

            // czyszczenie zmiennych i usuwanie '*' z paska tytułu
            this.isModified = false;
        }

        public void Open(object sender, EventArgs e)
        {
            form1.CheckModified(sender, e);

            // Pokazanie dialogu
            dlgResult = ofDialog.ShowDialog();
            if (dlgResult == DialogResult.Cancel)
                return;

            try
            {
                // Pobranie nazwy pliku
                this.actualFileName = ofDialog.FileName;
                // Otwarcie pliku
                sReader = new StreamReader(this.actualFileName);
                // Odczytywanie całości pliku
                form1.richTextBox.Text = sReader.ReadToEnd();
                sReader.Close();

                // Resetowanie zmiennych
                this.isModified = false;
                this.isSaved = true;
            }
            catch (Exception err)
            {
                // Wyjątek
                MessageBox.Show(err.Message, "Error",
                                 MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        // zapisuje istniejący plik
        // jeżeli plik nie istnieje wykonuje SaveAs
        public void Save(object sender, EventArgs e)
        {
            if (this.actualFileName == "")
            {
                this.SaveAs(sender, e);
                return;
            }
            else
            {
                    sWriter = new StreamWriter(sfDialog.FileName);
                    sWriter.Write(form1.richTextBox.Text);
                    sWriter.Close();
                    Form1.ActiveForm.Text = "MortEdit - " + this.actualFileName;
            }
            this.isModified = false;
        }

        // zapisuje plik z użyciem okna dialogowego
        public void SaveAs(object sender, EventArgs e)
        {
            // Ustawienie nazwy pliku na "bez nazwy x.mscr"
            sfDialog.FileName = "bez nazwy " + fileCounter.ToString() + ".mscr";
            dlgResult = sfDialog.ShowDialog();

            if (dlgResult == DialogResult.Cancel)
                return;

            try
            {
                // Ustawienie nazwy dla szybkiego zapisania
                this.actualFileName = sfDialog.FileName;

                // tworzenie nowego StreamWritera i zapisanie
                sWriter = new StreamWriter(this.actualFileName);
                sWriter.Write(form1.richTextBox.Text);

                // zamknięcie StreamWritera
                sWriter.Close();

                // inkrementacja licznika plików
                this.fileCounter++;
                this.isModified = false; // zapisany, więc nie modyfikowany ;)
                this.isSaved = true;
                
            }
            catch (Exception err)
            {
                MessageBox.Show("Wystąpił błąd: " + err.Message,
                                "Błąd! ",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }

        public void RunOnPC(object sender, EventArgs e)
        {
            if (this.isModified == true || this.isSaved == false)
            {
                this.Save(sender, e);
            }

            try
            {
                System.Diagnostics.Process.Start(this.actualFileName);
            }
            catch (Exception)
            {
                MessageBox.Show("Musisz zapisać plik!",
                    "Błąd!",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}
